package com.ming.exception;

import com.ming.enums.ErrorCode;
import lombok.EqualsAndHashCode;

/**
 * 文件相关业务异常
 *
 * @author ming
 * @version 1.0
 */
@EqualsAndHashCode(callSuper = true)
public class FileException extends BusinessException {

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     */
    public FileException(ErrorCode errorCode) {
        super(errorCode);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     */
    public FileException(ErrorCode errorCode, String message) {
        super(errorCode, message);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param cause     原因
     */
    public FileException(ErrorCode errorCode, Throwable cause) {
        super(errorCode, cause);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     * @param cause     原因
     */
    public FileException(ErrorCode errorCode, String message, Throwable cause) {
        super(errorCode, message, cause);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     * @param data      错误数据
     */
    public FileException(ErrorCode errorCode, String message, Object data) {
        super(errorCode, message, data);
    }

    /**
     * 构造函数
     *
     * @param errorCode 错误码
     * @param message   自定义错误信息
     * @param data      错误数据
     * @param cause     原因
     */
    public FileException(ErrorCode errorCode, String message, Object data, Throwable cause) {
        super(errorCode, message, data, cause);
    }

    // ========== 静态工厂方法 ==========

    /**
     * 文件不存在
     */
    public static FileException notFound(String message) {
        return new FileException(ErrorCode.FILE_NOT_FOUND, message);
    }

    /**
     * 文件上传失败
     */
    public static FileException uploadFailed(String message) {
        return new FileException(ErrorCode.FILE_UPLOAD_FAILED, message);
    }

    /**
     * 文件上传失败（带原因）
     */
    public static FileException uploadFailed(String message, Throwable cause) {
        return new FileException(ErrorCode.FILE_UPLOAD_FAILED, message, cause);
    }

    /**
     * 不支持的文件类型
     */
    public static FileException typeNotSupported(String message) {
        return new FileException(ErrorCode.FILE_TYPE_NOT_SUPPORTED, message);
    }

    /**
     * 文件大小超出限制
     */
    public static FileException sizeExceeded(String message) {
        return new FileException(ErrorCode.FILE_SIZE_EXCEEDED, message);
    }

    /**
     * 文件删除失败
     */
    public static FileException deleteFailed(String message) {
        return new FileException(ErrorCode.FILE_DELETE_FAILED, message);
    }

    /**
     * 文件删除失败（带原因）
     */
    public static FileException deleteFailed(String message, Throwable cause) {
        return new FileException(ErrorCode.FILE_DELETE_FAILED, message, cause);
    }

    /**
     * 文件下载失败
     */
    public static FileException downloadFailed(String message) {
        return new FileException(ErrorCode.FILE_DOWNLOAD_FAILED, message);
    }

    /**
     * 文件下载失败（带原因）
     */
    public static FileException downloadFailed(String message, Throwable cause) {
        return new FileException(ErrorCode.FILE_DOWNLOAD_FAILED, message, cause);
    }
}